import unittest
from app import app
from test_helper import login
from test_helper import get_id_when_radio_exist

#Id del rol con el que probara
ID_ROL = '1'

class TestCase(unittest.TestCase):
    """
    Clase que implementa los test para los casos de uso de Usuario.
    Utilizamos esta clase para realizar las pruebas de nuestra aplicacion SAP
    """
    
    def setUp(self):
        """
        se llama a este metodo antes de iniciar el test de la aplicacion
        , este metodo crea un nuevo cliente de prueba.
        Se especifican las acciones a ser tomadas antes de iniciar el test
        """
        
        print "Iniciando test"
        #self.db_fd, app.config['DATABASE'] = tempfile.mkstemp()
        self.app = app.test_client()
        self.acceso = login(self.app)
       


    def tearDown(self):
        """
        se llama a este metodo al terminar el test de la aplicacion,
        en el se especifican las acciones a ser tomadas al finalizar el test
        """
        print "Terminando test"


    def test_get_all_roles(self):
        """
        Controla que se pueda acceder a los usuarios
        """
        request = self.app.get('/usuario/administracion/', follow_redirects=True)
        #assert 'admin' in request.data
        self.assertEqual(request._status, '200 OK')
   
   
    def test_crear_usuario(self):
        """
        Controla que se puede crear un usuario, y luego verifica si el usuario fue 
        anhadido, se debe tener en cuenta que si el usuario no se lista luego de ser creado el 
        test fallara. Ademas, que de que se intenta crear un usuario con el rol con id [1].  
        Si este id no existe fallara
        """
        
        print "Probando crear un usuario"
        request = self._crear_usuario('test usuario', 'test@test.com', 'dia?', 'lunes', 'test',
                                       'test', ID_ROL)
        print "Respuesta satisfactoria, verificando si creo el usuario"
        request_all = self.app.get('/usuario/administracion/', follow_redirects=True)
        assert 'test usuario' in request_all.data
        print "Usuario creado correctamente"


    def test_crear_usuario_duplicado(self):
        """
        Test que prueba si se pueden crear usuarios duplicados
        """
        #Ahora probamos volver a crear
        print "Creacion de usuario con nombre repetido"
        request = self._crear_usuario('test usuario', 'test@test.com', 'dia?', 'lunes', 'test',
                                       'test', ID_ROL)
        print "Respuesta satisfactoria, verificando si dejo crear el usuario"
        assert 'El nombre de usuario ya existe, elija otro' in request.data
        print "Verificacion completa, no se pueden crear dos usuarios con el mismo nombre"


    def test_desactivar_usuario(self):
        """
        Test que verifica si se puede desactivar un usuario
        """
        print "Creando usuario con nombre test usuario 2."
        request = self._crear_usuario('test usuario 2', 'test@test.com', 'dia?', 'lunes', 'test',
                                       'test', ID_ROL)
        print "Verificando si se creo el usuario"
        all_request = self._get()
        assert 'test usuario 2' in all_request.data
        print "Usuario creado exitosamente"
        _id = get_id_when_radio_exist(all_request, 'test usuario 2')
        path = 'usuario/desactivar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'El usuario ha sido desactivado con exito' in borrar_request.data
        
    
    def test_desactivar_duplicado(self):
        """
        Test que verifica si se puede desactivar un usuario desactivado 
        """
        print "Creando usuario con nombre test usuario 2."
        request = self._crear_usuario('test usuario 3', 'test@test.com', 'dia?', 'lunes', 'test',
                                       'test', ID_ROL)
        print "Verificando si se creo el usuario"
        all_request = self._get()
        assert 'test usuario 3' in all_request.data
        print "Usuario creado exitosamente"
        
        print "Desactivando el usuario creado recientemente"
        _id = get_id_when_radio_exist(all_request, 'test usuario 3')
        path = 'usuario/desactivar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'El usuario ha sido desactivado con exito' in borrar_request.data
        
        print "Volviendo a desactivar el usuario desactivado"
        _id = get_id_when_radio_exist(all_request, 'test usuario 3')
        path = 'usuario/desactivar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'El usuario ya se encuentra con el estado DESACTIVADO' in borrar_request.data
        
            
    def _crear_usuario(self, nombre='test usuario', email='test@test.com', pregunta='dia?', respuesta='lunes', contrasenha='test', confirm='test', roles=ID_ROL):
        """
        Metodo que solo sirve para crear un usuario, lo crea y retorna la respuesta
        @param nombre: nombre del nuevo usuario
        @param email: direccion de correo del nuevo usuario
        @param pregunta: pregunta de seguridad del nuevo usuario
        @param respuesta: respuesta a la pregunta de seguridad del nuevo usuario
        @param contrasenha: contrasenha de acceso al sistema del nuevo usuario
        @param confirm: confirmacion de la nueva contrasenha
        @param roles: lista de roles que poseera el nuevo usuario en el sistema
        """
        request = self.app.post('/usuario/crear/', data=dict(
            nombre=nombre,
            email=email,
            pregunta=pregunta,
            respuesta=respuesta,
            contrasenha=contrasenha,
            confirm=confirm,
            roles=roles), follow_redirects=True)
        return request


    def _get(self, url ='/usuario/administracion/'):
        """
        Metodo que obtiene la pagina de administracion de usuarios
        @param url: url de la pagina de administracion de usuarios
        """
        return self.app.get(url, follow_redirects=True)
    

        
if __name__ == '__main__':
    unittest.main()